package cn.design.realize.cglibdemo;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @author dlq
 * @description
 * @date 2020/9/23 14:13
 * @since 1.0
 */
public class CglibProxy implements MethodInterceptor {
    /**
     * 抽象接口或者具体接口； 声明我(真实对象)需要代购(代理对象)帮忙做(替真实对象对象做)的事情
     * 就是我们的目标对象
     * 这里写成 Object 为了能够共用
     */
    private Object targetObject;

    public CglibProxy(Object targetObject) {
        this.targetObject = targetObject;
    }
    /**
     * @description 为目标对象生成代理对象
     * @param
     * @return java.lang.Object
     * @date 2020/9/23 14:30
     */
    public Object getProxyInstance(){
        //工具类
        Enhancer enhancer = new Enhancer();
        //设置父类,也就是我们的目标对象,作用是扩展这个targetObject对象
        enhancer.setSuperclass(targetObject.getClass());
        //设置回调函数
        enhancer.setCallback(this);

        //回调（如果有）以创建新的对象实例
        return enhancer.create();

    }
    /**
     * @description intercept 这个方法是在 代理对象具体调用方法的时候,再调用的
     * @param o
     * @param: method
     * @param: objects
     * @param: methodProxy
     * @return java.lang.Object
     * @date 2020/9/23 14:31
     */
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("cglib代理----开始执行targetObject方法......");
        Object resultValue = method.invoke(targetObject,objects);
        System.out.println("cglib代理----结束执行targetObject方法.....");
        return resultValue;
    }
}
